# 高阶函数
# 接收函数作为参数，或者将函数作为返回值的函数就是高阶函数


# 定义一个函数，用来检查一个任意数字是否为偶数
def fn2(i):
    if i % 2 == 0:
        return True
    return False


# 定义一个函数，用来检查一个任意数字是否大于5
def fn3(i):
    if i > 5:
        return True
    return False


# 定义一个函数，用来检查任意一个数字是否能被3整除


def fn4(i):
    if i % 3 == 0:
        return True
    return False


# 创建一个列表
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


# 定义一个函数，可以将指定列表中的所有偶数保存到一个新的列表中返回


def fn(func, lst):
    '''
        fn()函数可以将指定列表中的所有偶数获取到，并保存到新的列表中

        参数：
            lst：要进行筛选的列表
    '''
    # 创建一个新列表
    new_list = []
    # 对列表进行筛选
    for n in lst:
        # 判断n的奇偶
        if func(n):
            new_list.append(n)
    # 返回新列表
    return new_list


print(fn(fn2, l))

# filter()
# filter()可以从序列中过滤出符合条件的元素，保存到一个新的序列中
# 参数：
#   1.函数，根据该函数来过滤序列（可迭代结构）
#   2.需要过滤的对象（可迭代结构）
# 返回值：
#   过滤后的新序列（可迭代对象）

# fn4是作为参数传递金filter()函数中的，filter调用完毕后，fn4就没什么用了

r = filter(fn4, l)
print(list(r))


# 匿名函数lambda 表达式(语法糖)
#   lambda表达式专门用来创建一些简单的函数，它是我们创建函数的有一种方式
#   语法：lambda 参数列表：返回值
# 匿名函数一般都是作为参数使用，其他地方一般不会使用
def fn5(a, b):
    return a + b


# print(fn5(10,20))
lambda a, b: a + b
print(lambda a, b: a + b)
# 调用
# print((lambda a, b: a + b)(10, 30))

# 也可以将匿名函数赋值给一个变量，一般不这么用
fn6 = lambda a, b: a + b
# print(fn6(10, 50))

# 返回偶数
result = filter(lambda i: i % 2 == 0, l)
# 返回奇数
# result = filter(lambda i: i % 2 != 0, l)
# 返回能被3整除的数
# result = filter(lambda i: i % 3 == 0, l)
# 返回大于5的数
# result = filter(lambda i: i > 5, l)
print(list(result))

# map()
# map()函数可以对可迭代对象中的所有元素做指定的操作，然后将其保存到新的对象中返回
lst1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
r1 = map(lambda i: i + 1, lst1)
print(list(r1))

# sort()
# 该方法是对列表中的元素进行排序
# sort()默认是直接比较列表中元素的大小
# 在sort()可以接受一个关键字参数，key
#   key需要一个函数来作为参数，当设置了函数作为参数
#   每次都会以列表中的一个元素作为参数来调用函数，并且使用函数返回值来比较元素大小
lst2 = ['bbbb', 'cc', 'dddddd', 'ggggg', 'ff', 'ssssssss']
# lst2.sort()
lst2.sort(key=len)
print(lst2)

lst3 = [1, 2, '4', '6', 5, 8, 7, '3']
lst3.sort(key=int)
print(lst3)

# sorted()
# 这个函数和sort()的用法基本一致，但是sorted()可以对任意序列进行排序
#   并且使用sorted()排序不会影响原来的对象，而是返回一个新的对象

lst4 = [1, 2, '4', '6', 5, 8, 7, '3']
print('排序前：', lst4)
print(sorted(lst4, key=int))
print('排序后：', lst4)
